## Version 2.2.0 (03. Sep 2013)

#### General

- CHG:	From now on, all release build assemblies will contain Trace output, for example warnings about unhandled 
		exceptions, inappropritely defined message handler, etc.


#### amarok.common

- CHG:	Enhanced *FindBaseException<T>(..)* on *Helper* and extension method *FindBaseException<T>()* on *Exception*
		to support *AggregateException*. Now, all inner exceptions and all inner aggregrate exceptions are searched
		for a matching exception type. This method will return only the first matching exception.

- NEW:	Introduced *FindBaseExceptions<T>(..)* on *Helper* and extension method *FindBaseExceptions<T>()* on 
		*Exception* that search through all inner exceptions, including AggregateExceptions, and return an array
		of all exceptions matching the given exception type.

- NEW:	Introduced helper methods *GetTempPath()* and *GetTempFile()* on static class *Helper*. Those methods generate 
		unique folder/file names for temporary use, but don't create these folders/files.

- NEW:	Introduced extension method *ReadToEnd()* on *Stream* that returns a *BufferSegment* containing the sequence
		of bytes read from the given stream.

- NEW:	Introduced constants *KiloByte*, *MegaByte*, *GigaByte* and *TeraByte* on *Helper*. You can use those 
		constants like '5 * Helper.MegaByte' instead of '5 * 1024 * 1024'.


#### amarok.agents

- CHG:	Introduced property *Id* of type *Guid* on class *Message*. This property is automatically populated with 
		a globally uniuqe id for each newly instantiated message. This property represents a unique message id and
		can be used for identification purposes.

- CHG:	Type *Message* now overrides *GetHashCode()* and *Equals()* to determine equalitiy of two message instances
		by their message id. *Message* also realizes *IEquatable<Message>*.

- CHG:	Method *Post()* on *IDispatcher* now returns a boolean value, instead of void. This boolean value indicates
		whether the message being posted has been scheduled for further processing. False indicates that the message
		is not scheduled, because either no matching message handler exists, the message has been filtered or the
		dispatcher is completing or has already been completed.

- NEW:	Introduced static class *AgentHooks* that provides various hooks (events) for diagnosis purposes. For example,
		each time an agent publishes a message the event *MessagePublished* will be raised. Supplied event args will 
		provide information about the agent and the message being published. Similar, the events *OperationHandlerStarted* 
		and *OperationHandlerFinished* will be raised when execution of an operation handler starts and finishes.


#### amarok.presentation

 NEW:	Added overloaded extension method *Localize(..)* on *LocalizeHelper* to support *HeaderedItemsControl*, 
		e.g. *MenuItem* or *RibbonGroup*.

- NEW:	Introduced method *SetupDialogWindowStyle()* on type *Wpf* that can be used to change the style of a 
		given window to a modal dialog, i.e. removing the minimize and maximize boxes.

- NEW:	Introduced attached behavior *DialogBehavior.IsDialog* (in XAML: a:DialogBehavior.IsDialog="true") that 
		can be set to True to change the style of the target window to a modal dialog. Please note, that changing 
		the attached property back to False does not remove the dialog-style.

- NEW:	Introduced static class *ViewModelHooks* that provides various hooks (events) for diagnosis purposes. For 
		example, each time a view model object raises a property changed event the hook event *PropertyChanged* will 
		be raised. Supplied event args will provide information about the view model instance and the property name
		being changed.

- NEW:	Introduced static class *ViewCommandHooks* that provides various hooks (events) for diagnosis purposes. For 
		example, each time the command is executed the event *ExecuteCalled* will be raised. Supplied event args will 
		provide information about the view command handler.


## Version 2.1.0 (20. Jul 2013)

#### amarok.common

- FIX:	Fixed bug in *Helper.FormatException(..)* that outputs properties twice.


#### amarok.agents

- NEW:	Introduced optional message filter callback in *DefaultDispatcher* that is called for each incoming message.

- NEW:	Introduced *Label*, *HasLabel* and *ResetLabel* on *Agent*.

- NEW:	Introduced an overridable method *OnFilter()* on *Agent* that allows derived types to implement custom message 
		filtering. The filter method is called for each incoming message. The default implementation permits the 
		message if either the agent or the message have no label assigned. If both agent and message have a label 
		assigned, then only messages with a label that equals the label of the agent are permitted.




## Version 2.0.0 (08. June 2013)

#### amarok.agents

- FIX:	The processing order of exclusive message handler with a parallelism level other than *NoParallelism* was 
		occasionally wrong under heavy cpu load. This has been fixed.


#### amarok.presentation

- CHG:	**[Breaking]** Changed overridable method *CreateView()* on *ViewDescription* to accept agent environment
		and agent options.

- CHG:	**[Breaking]** Removed controller constructor with 3 arguments. Now, all controllers only need to implement
		a single constructor that accepts 4 arguments: environment, options, view and view model. Adapted controller
		factories accordingly.

- NEW:	Added property *Control* to interface *IView*. *Control* returns the *FrameworkElement* that implements 
		the view. Adapted *ViewDescription* to take advantage of this.

- NEW:	Introduced attached dependency properties *View.Environment* and *View.Options*. Those attached properties
		can be used to attach agent environment and agent options to various FrameworkElements. The attached properties 
		inherit theirs values to child elements much like *DataContext*.

- NEW:	Adapted *WindowDescription* to set the new attached dependency properties *Environment* and *Options* on 
		its view.

- NEW:	Introduced control *ZonePresenter*, which can be used as a placeholder for embedded content, which can be
		defined via a *ZoneDescription*. *ZonePresenter* will instantiate and complete view, view model and 
		controller. This control requires that the attached properties *View.Environment* and *View.Options* are 
		defined on a parent FrameworkElement and will use those values for the zone's controller.

- NEW:	Introduced class *WindowPosition*, which holds location and state of a window.




## Version 1.16.0 (25. May 2013)


#### General

- FIX:	Fixed NuGet package *amarok.common* for .NET Framework 4.5 to no longer include *Microsoft.Bcl.Async*.

- CHG:	Changed versioning schema to Semantic Versioning.

- CHG:	Improved tracing output in *CompletableObject*, *Agent*, *Subsystem* and *Runtime*. Now, the *ObjectId* is 
		output instead of just the object's type.

#### amarok.common

- NEW:	Introduced *ExpandText()* on *Helper*. This method can be used to expand placeholders in a given text.

- NEW:	Introduced *CrcCalculator* a helper class for calculating various CRCs. The original source can be found
		at http://www.codeproject.com/csharp/marcelcrcencoding.asp.




## Version 1.15 (18. May 2013)


#### General

- CHG:	Assemblies targeting .NET Framework 4.5 are now compiled against the official version 4.5.9 of 
		Microsoft.TPL.Dataflow. Assemblies targeting .NET Framework 4.0 are now compiled against the offical version 
		1.0.16 of Microsoft.Bcl.Async, which replaces Microsoft.CompilerServices.AsyncTargetingPack, and the latest
		CTP version of Microsoft.TPL.Dataflow.


#### amarok.common

- NEW:	Introduced base class *IdentifiableObject*, which manages an object-id consisting of the object's type-name 
		and an optional instance-name. The object-id, a string formatted as "type-name[:instance-name]" can be used to 
		distinguish object instances of the same type.

- CHG:	**[Breaking]** The base classes *DisposableObject* and *CompletableObject* now derive from *IdentifiableObject* 
		and therefore provide new appropriate constructor overloads.

- CHG:	**[Breaking]** Changed return type of extension method *WaitQuietly(..)* on *TaskExtensions* from *Task* to 
		*void*. Now, the method is consistent to other *Wait()* methods, e.g. *Task.Wait()*. Please note that the method
		no longer accepts null values.

- FIX:	**[Severe]** Fixed a dead-lock that could occur when calling *WaitQuietly()* from within a message handler with 
		exclusive execution mode.

- NEW:	Introduced overloads of extension method *WaitQuietly(..)* on *TaskExtensions* that accept a timeout similar
		to *Task.Wait(Int32)* and *Task.Wait(TimeSpan)*.

- NEW:	Added static methods *GetAssemblyProduct()*, *GetAssemblyCompany()* and *GetAssemblyCopyright()* on *Helper*
		that can be used to obtain product name, company and copyright notice defined via assembly-level attributes.

- CHG:	**[Breaking]** Renamed method *Append()* on *BufferSegment* to *Add()* to comply with framework design 
		guidelines.


#### amarok.agents


##### General

- FIX:	**[Severe]** The processing order of message handler with exclusive execution context was not correct. This 
		has been fixed.

- CHG:	**[Breaking]** Removed interface *ISubscription*. Now, *ICompletable* is used instead. Since *ISubscription* 
		already derived from *ICompletable*, this breaking change should be easy to fix.

- NEW:	Added overloads of *PostOperation()* and *PublishOperation()* on *Agent*, *Runtime*, *DispatcherExtensions* 
		and *PublisherExtensions* that accept a *CancellationToken*. The posted/published operation will be canceled 
		when the supplied *CancellationToken* is being canceled.

- NEW:	Added overloads of *PostAfter()* and *PublishAfter()* on *Agent*, *DispatcherExtensions* and 
		*PublisherExtensions*. These methods will post/publish a message after a given time delay.

- NEW:	Introduced new *MessageBusConnectedAttribute* that can be assigned to *Agent* or *Controller* implementation 
		types to specify that this agent/controller should be automatically connected to the runtime's message bus 
		after being spawned. This new mechanism only works for agents and controllers spawned via *Agent.Factory* or 
		*Controller.Factory*, which is generally the recommended way.

- CHG:	**[Breaking]** Unified the way when and how agents get automatically connected to the runtime's message bus.
		Previous, only agents spawned from within subsystems were automatically connected to the message bus. This
		concept was unclear and did not help in managing agents spawned by other agents. Now, all agents that are 
		spawned via *Agent.Factory* AND that receive an agent environment of *RuntimeEnvironment* or derived AND that 
		are tagged with the new *MessageBusConnectedAttribute* are automatically connected to the message bus that is 
		supplied via the given runtime environment.


##### Agent

- CHG:	**[Breaking]** Renamed protected method *GetAgentReference()* on *Agent* to *ToAgentReference()*. Renamed 
		extension method *GetAgentReference()* on *AgentExtensions* to *ToAgentReference()*.

- CHG:	The type *AgentSpawnException* is no longer sealed. You can derive your own types from it.

- NEW:	Introduced static property *Factory* on *Agent*. This property returns the default agent factory represented 
		by interface *IAgentFactory*. Various overloads are provided via extension methods. The default factory 
		behavior is implemented in *DefaultAgentFactory*, from which one can derive to override the default behavior. 
		The new specific agent factory can be registered via *SetFactory()* on *Agent*.

- CHG:	**[Breaking]** Removed *AgentFactory*. Instead of *AgentFactory.SpawnAgent(..)* call 
		*Agent.Factory.SpawnAgent(..)*.


##### Runtimes

- CHG:	*RuntimeStartException* is no longer sealed.

- CHG:	The implementation of *Runtime* is now thread-safe in respect to loading other subsystems.


##### Subsystems

- NEW:	Introduced static property *Factory* on *Subsystem*. This property returns the default subsystem factory 
		represented by interface *ISubsystemFactory*. Various overloads are provided via extension methods. The 
		default factory behavior is implemented in *DefaultSubsystemFactory*, from which one can derive to override
		the default behavior. The new specific subsystem factory can be registered via *SetFactory()* on *Subsystem*.

- CHG:	**[Breaking]** Removed *SubsystemFactory*. Instead of *SubsystemFactory.LoadSubsystem(..)* call 
		*Subsystem.Factory.LoadSubsystem(..)*.

- CHG:	*SubsystemLoadException* is no longer sealed. You can derive your own types from it.

- CHG:	*ISubsystem.Load()* will always throw exceptions of type *SubsystemLoadException*.

- CHG:	The implementation of *Subsystem* is now thread-safe in respect to loading and spawning other subsystems 
		and agents.


#### amarok.presentation


##### General

- NEW:	Introduced type *Designer* that provides design-time helpers. The properties *IsDesignMode* and 
		*IsRuntimeMode* can be used to determine whether code is running in design-time, e.g. within Visual Studio 
		or Expression Blend.

- NEW:	Introduced new extension methods *Localize()* that can be used to apply localized text resources to common
		WPF controls like Button, Label, TextBlock, Expander, etc. For example, you can now call *MyButton.Localize(..)*
		in your Window's code-behind instead of *MyButton.Content = text*.


##### ViewCommand

- CHG:	*ViewCommand* and *ViewCommand<T>* are no longer sealed. The methods *CanExecute()*, *Execute()* and 
		*RaiseCanExecuteChanged()* are now virtual, so that it is possible to derive from those types and override
		the default behavior.

- CHG:	*ViewCommand* and *ViewCommand<T>* no longer add event handler to *CommandManager.RequerySuggested* when
		no *CanExecute* action is specified, because without an *CanExecute* action the command never changes its
		state that determines whether the command can be executed, thus, the *CanExecuteChanged* event will never
		be raised.

- NEW:	Added optional constructor argument *ignoreNullParameter* on *ViewCommand<T>* that defaults to *true*. This 
		new boolean value indicates whether calls to *CanExecute(T)* or *Execute(T)* should be ignored when *T* equals
		to *null*. This is useful for commands with data-bound *CommandParameter*, because WPF calls *CanExecute(T)* 
		once directly after resolving the data binding with the command parameter set to null.

- NEW:	*ViewCommand* and *ViewCommand<T>* now implement *IDisposable*. The specified *CanExecute()* and *Execute()* 
		callbacks won't be called anymore after disposing a command instance.


##### ViewModel

- CHG:	Changed method *RaisePropertyChanged(String propertyName)* so that the argument *propertyName* is optional. 
		If the argument is not specified, the name of the calling method, property or event is automatically inserted 
		by the compiler, thus, it is enough to call *RaisePropertyChanged()* from within a property's setter method.

- NEW:	Added support for handling parent references to *ViewModel*. Introduced properties *HasParent* and *Parent*. 
		The parent view model can be specified via constructor or by setting property *Parent*. Property-changed 
		notifications for *HasParent* and *Parent* will be raised appropriately.

- NEW:	Introduced generic base class *ViewModel<TParent>*, which can be used whenever the reference to the parent 
		view model should be type-safe.

- NEW:	Introduced methods *SetProperty(..)* on *ViewModel*. Those methods can be used within a property's setter 
		method to assign the new value to the backing field and raise a corresponding property-changed notification.

- BUG:	Fixed bug in *VerifyPropertyName()* that results in cases where an *AmbiguousMatchException* was thrown.


##### View

- NEW:	Introduced overrideable method *OnLocalize()* on *ViewWindow*, *ViewUserControl* and 
		*FrameworkElementViewAdapter<T>*. This overridable method is called once after the view has been loaded. 
		Override this method to localize static text resources.

- NEW:	Introduced overrideable method *OnLoaded()* on *ViewWindow*, *ViewUserControl* and 
		*FrameworkElementViewAdapter<T>*. This overridable method is called once after the view has been loaded. 
		Override this method to implement specific logic requiring the view to be fully initialized and loaded, e.g. 
		the entire tree of UI elements is loaded and the view model is assigned to the view.


##### Controller

- FIX:	**[Breaking]** The properties *View* and *ViewModel* are no longer visible to derived types. This was not 
		intended. Derived controller types should use *AccessView()* or *AccessViewModel()* to safely access the 
		view/view model in the context of the user interface thread.

- CHG:	**[Breaking]** *ControllerFactory* now throws *ControllerSpawnException* whenever the instantiation of a 
		controller fails.

- CHG:	**[Breaking]** Unified the way when and how controllers get automatically connected to the runtime's message 
		bus. Previous, only controllers spawned from within subsystems were automatically connected to the message bus. 
		This concept was unclear and did not help in managing controllers spawned by other controllers. Now, all 
		controllers that are spawned via *ControllerFactory* AND that receive an agent environment of 
		*RuntimeEnvironment* or derived AND that are tagged with the new *MessageBusConnectedAttribute* are 
		automatically connected to the message bus that is supplied via the given runtime environment.

- NEW:	Introduced overridable method *OnPresetViewModel()* on *Controller*, which is called once during construction 
		to give derived types a chance to pre-initialize the view model before it is assigned to the view. Override 
		this method to initialize the given view model to its initial state, e.g. instantiate and assign commands.




## Version 1.12 (15. Dec 2012)

- CHG:	Assemblies targeting .NET Framework 4.5 are now compiled against the official release version 4.5.8 available via NuGet (Microsoft.TPL.Dataflow).


#### amarok.agents


##### Dispatcher

- NEW:	Introduced interface *IDispatcher* to represent the concept of a dispatcher. A dispatcher is an object that is capable to forward (dispatch) messages to appropriate message handler. In general this is done by invoking the message handler method and supplying the message as an argument to the invoked method. In addition, a dispatcher provides rich queuing and scheduling mechanism that decouple caller from callee.

- NEW:	The interface *IDispatcher* contains a single method *Post(Message)*. Overloaded variants of *Post(..)* and *PostOperation(..)* are provided via extension methods implemented in *DispatcherExtensions*.

- NEW:	The default implementation of a dispatcher that is used in agents is publicly available as *DefaultDispatcher*.


##### Publisher

- NEW:	Introduced interfaces *IPublisher* and *IAdvertiser* to represent the concepts of a publisher. A publisher is an object that is capable to send out (publish) messages to interested consumers (subscribers). In general a publisher serves two sides. First, the publishing side, second the side that manages consumer subscriptions. *IPublisher* represents the publishing side. *IAdvertiser* represents the side responsible for managing subscriptions.

- NEW:	The interface *IPublisher* contains a single method *Publish(Message)*. Overloaded variants of *Publish(..)* and *PublishOperation(..)* are provided via extension methods implemented in *PublisherExtensions*.

- NEW:	Likewise, the interface *IAdvertiser* contains an overloaded method *Subscribe(..)*. Further overloads are provided via extension methods implemented in *AdvertiserExtensions*.

- NEW:	The default implementation of a publisher that is used in agents and in the message bus implementation is publicly available as *DefaultPublisher*.


##### MessageBus

- CHG:	**[Breaking]** The interface *IMessageBus* now realizes *IAdvertiser* and *IPublisher*. The overloaded methods *Subscribe(..)*, *Publish(..)* and *PublishOperation(..)* are now defined by *IAdvertiser* and *IPublisher* instead of by *IMessageBus* directly.

- CHG:	**[Breaking]** Renamed the default implementation of a message bus from *MessageBus* to *DefaultMessageBus*.


##### Messages

- CHG:	Optimized *Operation{TResult, TProgress}* so that the logic required for reporting progress is lazily loaded as needed. Since most operation messages won't use the progress reporting feature this reduces the overall allocation rate.


##### Agent

- CHG:	**[Breaking]** Introduced exception *AgentSpawnException*. This exception is thrown whenever the instantiation of a new agent fails. Prior a *MissingMethodException* was thrown.

- CHG:	**[Breaking]** The interface *IAgent* now realizes *IAdvertiser* and *IDispatcher*. The method *Post(..)* is now defined by *IDispatcher* instead of by *IAgent* directly. Furthermore, types implementing *IAgent* now have to realize *IAdvertiser*. *AgentReference* has been updated accordingly. Nearly all extension methods on *IAgent* are now available either for *IDispatcher* or for *IAdvertiser*.

- NEW:	Introduced interface *IAgentProxy* as companion to *IAgent*. *IAgentProxy* represents the inside view of an agent, which provides functionality to post and publish messages, whereas *IAgent* represents the outside view of an agent, which does not allow the publishing of messages. Since *Agent* realizes *IAgentProxy*, the new interface can be used to refactor logic out of agents (types derived from Agent) into helper types that accept a reference to an agent via *IAgentProxy*, which enables the helper types to post and publish messages much like inside of an agent.


##### Subsystem

- CHG:	**[Breaking]** Removed protected method *RegisterSubscription(..)* from *Subsystem*.




## Version 1.10 (02. Nov 2012)


#### amarok.common

- CHG:	**[Breaking]** Renamed overloaded extension method *WaitForCompletion()* on *TaskExtensions* to *WaitQuietly()*. The method blocks the current thread until the supplied task completes much like *task.Wait()*, but in contrast *WaitQuietly()* does not throw an exception in case that the task canceled or completed in a faulted state.

- CHG:	**[Breaking]** Renamed type *NullTaskCompletionSource* to *TaskCompletionSource*. This type is a simple wrapper around *TaskCompletionSource{T}* for the sole purpose of signaling completion via the returned *Task*. It is not possible to complete the *Task* in a canceled or faulted state.

- CHG:	**[Breaking]** Renamed type *Empty* to *None* to prevent naming collisions with properties named 'Empty'. In addition, the type has been moved from assembly *amarok.agents* to *amarok.common* and from namespace *Amarok.Agents* to *Amarok*.

- CHG:	Moved type *FailureException* from assembly *amarok.agents* to *amarok.common*. Changed namespace from *Amarok.Agents* to *Amarok*.

- NEW:	Added method *IsAssignableTo(..)* to type *Verify*, which verifies that the supplied type is assignable to the expected target type. The target type can be either a base class, meaning that the supplied type must derive from that base class, or the target type can be an interface, meaning that the supplied type must implement the specified interface.

- NEW:	Added static properties *Completed* and *Canceled* to type *TaskHelper*. These properties return pre-instantiated cached *Task* objects that have alreay been completed, either in succeeded or canceled state.

- NEW:	Made utility types *NativeEnvironment* and *NativeThreading* in namespace *Amarok.Native* publicly available.

- CHG:	Reviewed and updated documentation on all types in assembly *amarok.common*.


#### amarok.agents

- CHG:	**[Breaking]** Moved types *Empty* and *FailureException* into assembly *amarok.common*.


##### Agents

- NEW:	Added missing extension method *Post(Object, Message)* to *IAgent*. Prior, this overloaded method was only available from within an agent (in types derived from *Agent*) but not when using an agent interface.

- NEW:	Added protected method *GetAgentReference()* to *Agent*. This method returns a new agent reference to the calling agent, which can be handed over to other agents via messages.

- NEW:	Added an implict cast operator that is able to convert an agent instance into an agent reference. That way it is no longer necessary to call *GetAgentReference()* when supplying an agent object where an *AgentReference* is expected.


#### amarok.presentation

- CHG:	**[Breaking]** All async methods on *Controller* like *SendAsync*, *AccessViewModelAsync(..)* etc. now return a *Task* that represents the ongoing asynchronous operation and can be used to wait for completion, to register a continuation and to access state and result of the operation.

- CHG:	**[Breaking]** *SendAsync(..)* and *InvokeAsync(..)* on *IView* now return a *Task* which represents the asynchronously running operation. This task can be used to wait for completion, to register a continuation and to access the state of the operation.

- CHG:	**[Breaking]** Renamed overloaded method *Close(..)* on *Controller* to *CloseWindow(..)*.

- CHG:	**[Breaking]** Removed type *PresentationSubsystem*.

- CHG:	**[Breaking]** Removed type *Controller{TViewModel, TView}*, but added *Controller{TViewModel, TEnvironment, TOptions}*.

- CHG:	**[Breaking]** Renamed *ViewAdapter{T}* to *FrameworkElementViewAdapter{T}*.

- CHG:	**[Breaking]** Removed various *SpawnController(..)* method overloads from *ControllerFactory*.

- NEW:	Introduced *ViewDescription* and derived types *WindowDescription* and *WindowDescription{TWindow, TController, TViewModel}*. A view description is a description of the combination of view, view model and associated controller. A view description is also capable to instantiate and connect view and controller and to manage the life cycles of those instances.

- NEW:	Added overloaded methods *ShowWindow(..)* and *ShowDialog(..)* to *Controller* that accept a *WindowDescription*. These methods send specific view actions to the associated view to request the view to show a new main-level view or to show a dialog window. New functionality added to *ViewWindow* supports these view actions.




## Version 1.8.1 (16. Sep 2012)

- FIX:	Re-published NuGet packages to fix package dependencies for .NET 4 projects. This release does not contain any other code changes.




## Version 1.8 (23. Aug 2012)

- CHG:	Added support for Visual Studio 2012 RTM and .NET Framework 4.5 RTM. All assemblies are provided for both .NET Framework 4 and .NET Framework 4.5. Assemblies targeting .NET Framework 4 are compiled against the latest CTP version of *System.Threading.Tasks.Dataflow* (version 1.0.4303). Assemblies targeting .NET Framework 4.5 are compiled against version 4.5.6 available via NuGet (Microsoft.TPL.Dataflow).


#### amarok.common

- CHG:	**[Breaking]** Re-designed base class *CompletableObject*. The overridable method *OnCompleting(..)* is no longer available. The overridable method *OnComplete(..)* now returns a *Task*, which is used to signal completion. The implementation of *OnComplete(..)* should return as fast as possible and perform as much work as possible asynchronously without blocking the calling thread.

- NEW:	Introduced *ILazyProgress<T>*, an interface derived from *IProgress<T>*, which defines a provider for progress updates that features the lazy creation of progress values.
 
- NEW:	Introduced *IntervalConstrainedProgress<T>*, which represents a decorator around *IProgress<T>* that constrains the number of progress updates based on a configurable minimum time interval between two progress updates. This type can be used to reduce the number of progress updates of existing progress providers. This type implements both *ILazyProgress<T>* and *IProgress<T>*.

- NEW:	Introduced *NullProgress<T>*, which silently ignores any reported progress value. This type implements both *ILazyProgress<T>* and *IProgress<T>*.

- NEW:	The extension method *FindBaseException<T>(..)* on *Exception* is now also available as *Helper.FindBaseException<T>(exception)*.

- NEW:	Introduced method *Helper.GetInnerMostException(..)* and a corresponding extension method *GetInnerMostException(..)* on *Exception*.

- NEW:	Introduced *NullTaskCompletionSource*, which is a simple wrapper around *TaskCompletionSource<T>* for the sole purpose of signaling completion via the returned Task. It is not possible to complete the *Task* in a cancelled or faulted state.

- NEW:	Added *FromResult<T>(..)* to *TaskHelper*. On .NET 4.5 *Task.FromResult<T>(..)* is called. On .NET 4 the method	is implemented using a *TaskCompletionSource<T>*.


#### amarok.agents

- FIX:	A thread-blocking implementation of the complete pattern in most objects (runtime, subsystem, agent, etc.) caused a delay of a few seconds when shutting down a runtime with a few subsystems and a few agents. This has been fixed. Now all completable objects are capable to tear down asynchronously; without blocking threads.



##### Agents

- NEW:	Introduced support for async message handler. Methods marked with the *MessageHandlerAttribute* can now use the async modifier, but have to change the return type from void to *Task* (*System.Threading.Tasks.Task*). It is ensured that code portions (continuations) after awaits will run in the correct execution context, for example concurrent or exclusive execution.

		[MessageHandler, ConcurrentExecution]
		private async Task MyAsyncHandler(MyMessage message)
		{
			await Task.Delay(1000);
		}

- NEW:	Introduced support for async information handler. Methods marked with the *InformationHandlerAttribute* can now use the async modifier, but have to change the return type from void to *Task* (*System.Threading.Tasks.Task*). It is ensured that code portions (continuations) after awaits will run in the correct execution context, for example concurrent or exclusive execution.

		[InformationHandler, ConcurrentExecution]
		private async Task MyAsyncHandler(MyInformation message)
		{
			await Task.Delay(1000);
		}

- NEW:	Introduced support for async operation handler. Methods marked with the *OperationHandlerAttribute* can now use	the async modifier, but have to change the return type from *TResult* to *Task<TResult>* (*System.Threading.Tasks.Task<TResult>*). It is ensured that code portions (continuations) after awaits will run in the correct execution context, for example concurrent or exclusive execution.

		public class MyOperation<String, Int32>
		{
		}

		[OperationHandler, ConcurrentExecution]
		private async Task<String> MyAsyncHandler(MyOperation message)
		{
			await Task.Delay(1000);
			return "done";
		}


##### Runtime

- CHG:	**[Breaking]** Changed *Runtime* to *Runtime<TEnvironment>*. It is now required to specify the runtime environment type as generic type argument. Various type members will use *TEnvironment* instead of *RuntimeEnvironment*.

- CHG:	**[Breaking]** The method *Start()* on *Runtime<TEnvironment>* now throws an *InvalidOperationException* (instead of *ObjectDisposedException*) when the method is called after the runtime has been shut down.

- CHG:	**[Breaking]** The method *Start()* on *Runtime<TEnvironment>* now throws a *RuntimeStartException* when starting the runtime fails. Refer to the inner exception for more details.

- NEW:	Added overloaded method *PublishOperation(..)* to *Runtime<TEnvironment>*.

- CHG:	**[Breaking]** The overloaded method *LoadSubsystem(..)* on *Runtime<TEnvironment>* now throws an *InvalidOperationException* (instead of *ObjectDisposedException*) when the method is called after the runtime has been shut down.

- CHG:	**[Breaking]** The overloaded method *LoadSubsystem(..)* on *Runtime<TEnvironment>* now throws a *SubsystemLoadException* (instead of *MissingMethodException*) when loading a subsystem fails. Refer to the inner exception for more details.


##### Subsystem

- CHG:	**[Breaking]** Changed *Subsystem* to *Subsystem<TEnvironment>*. It is now required to specify the runtime environment type as generic type argument. Various type members will use *TEnvironment* instead of *RuntimeEnvironment*.

- CHG:	**[Breaking]** The method *Load()* on *ISubsystem* now throws a *SubsystemLoadException* (instead of *MissingMethodException*) when loading a subsystem fails. Refer to the inner exception for more details.

- CHG:	**[Breaking]** The overloaded method *LoadSubsystem(..)* on *Subsystem<TEnvironment>* now throws a *SubsystemLoadException* (instead of *MissingMethodException*) when loading a subsystem fails. Refer to the inner exception for more details.

- CHG:	**[Breaking]** Introduced overrideable method *OnCleanup()* on *Subsystem<TEnvironment>*, which can be overridden to implement custom cleanup logic. For full control over the completion one can override *OnComplete(..)* or *OnCompleted()*. For simple cleanup tasks *OnCleanup()* should be suitable.

- CHG:	**[Breaking]** The overloaded method *LoadSubsystem()* on *SubsystemFactory* now throws a *SubsystemLoadException* (instead of *MissingMethodException*) when loading a subsystem fails. Refer to the inner exception for more details.


#### amarok.presentation

- NEW:	Introduced base classes for implementing custom value converters. You can use either *ValueConverter<..>* to implement a value converter that is very specific, must be instantiated and cannot be shared by multiple data bindings, or you can derive from *MarkupExtensionValueConverter<..>* which is a value converter and markup extension at the same time, allowing the converter to be used without instantating it first in XAML. But this kind of value converter must be state-less, meaning a single instance must be able to serve multiple data bindings at the same time.

- CHG:	**[Breaking]** Reworked all existing value converters to derive from either *ValueConverter<..>* or *MarkupExtensionValueConverter<..>*. In addition the behavior of all value converters in error situations was unified based on best practice recommendations, meaning value converters will return the special value *DependencyProperty.UnsetValue* whenever a conversion is not possible.
 
- CHG:	**[Breaking]** Renamed following value converters:
	- *BooleanToValueConverter* to *BooleanToObjectConverter*
	- *Int32ToValueConverter* to *IndexToObjectConverter*
	- *HasTextConverter* to *IsNotNullOrEmptyConverter*
	- *HasNotTextConverter* to *IsNullOrEmptyConverter*

- NEW:	**[Breaking]** Following is a list of all available value converters:
	- *NotConverter*  (Boolean -> Boolean)
	- *IsNullConverter*  (Object -> Boolean)
	- *IsNotNullConverter*  (Object -> Boolean)
	- *IsNullOrEmptyConverter*  (String -> Boolean)
	- *IsNotNullOrEmptyConverter*  (String -> Boolean)
	- *BooleanToObjectConverter*  (Boolean -> Object)
	- *IndexToObjectConverter*  (Int32 -> Object)
	- *CollapsedWhenTrueConverter*  (Boolean -> Visibility)
	- *CollapsedWhenFalseConverter*  (Boolean -> Visibility)
	- *CollapsedWhenNullConverter*  (Object -> Visibility)
	- *CollapsedWhenNotNullConverter*  (Object -> Visibility)
	- *CollapsedWhenNullOrEmptyConverter*  (String -> Visibility)
	- *CollapsedWhenNotNullOrEmptyConverter*  (String -> Visibility)
	- *HiddenWhenTrueConverter*  (Boolean -> Visibility)
	- *HiddenWhenFalseConverter*  (Boolean -> Visibility)
	- *HiddenWhenNullConverter*  (Object -> Visibility)
	- *HiddenWhenNotNullConverter*  (Object -> Visibility)
	- *HiddenWhenNotNullOrEmptyConverter*  (String -> Visibility)
	- *HiddenWhenNullOrEmptyConverter*  (String -> Visibility)

- CHG:	**[Breaking]** Changed *PresentationSubsystem* to *PresentationSubsystem<TEnvironment>*. It is now required to specify the runtime environment type as generic type argument. Various type members will use *TEnvironment* instead of *RuntimeEnvironment*.




## Version 1.6 (20. Jun 2012)

- CHG:	Added support for Visual Studio 2012 RC and .NET Framework 4.5 RC. All assemblies are provided for both .NET Framework 4 and .NET Framework 4.5 RC. Assemblies targeting .NET Framework 4 are compiled against the latest CTP version of *System.Threading.Tasks.Dataflow*. Assemblies targeting .NET Framework 4.5 RC are compiled against the pre-release version 4.5.4 available via NuGet (Microsoft.TPL.Dataflow).


#### amarok.common

- FIX:	Modified the implementation of the overloaded extension methods *IgnoreExceptions(..)* and *WaitForCompletion(..)* on type *TaskExtensions* to always run on the default task scheduler, instead of the calling thread's current task scheduler. This fixes a possible deadlock when calling one of those methods from a message handler, whose agent is torn down in the meantime.


#### amarok.agents

- FIX:	Fixed a possible deadlock that occurs when calling *Dispose()* on the agent from within a message handler of that agent. This deadlock also occurs when calling *Complete(..)* on the agent and waiting for completion via *Completion* as long as the message handler is blocked while the agent is torn down.

- NEW:	Added overloaded method *PublishOperation(..)* on *IMessageBus*.




## Version 1.5 (10. May 2012)


#### amarok.common

- CHG:	**[Breaking]** Renamed assembly *amarok.framework* to *amarok.common*.

- FIX:	Fixed serialization support for *StringDictionary<T>* and *TypeDictionary<T>*. Added missing constructors that accept *SerializationInfo* and *StreamingContext*.

- NEW:	Introduced overloaded extension method *WaitForCompletion()* on *Task* that blocks the calling thread until the task enters a completion state much like *task.Wait()*, but in contrast to *task.Wait()* these extension methods do not throw exceptions when the task completed in a canceled or faulted state.

- NEW:	Introduced interface *ICompletable* and implementation base class *CompletableObject*. The dispose pattern represented by *IDisposable* is well suited for disposing (or tearing down) objects in a synchronous blocking manner; the calling thread is blocked until the object is finally disposed. For a thread-safe implementation one can derive from *DisposableObject*. In an asynchronous world blocking isn't a good idea. *ICompletable* represents a new pattern (borrowed from TPL Dataflow) for tearing down objects asychronously. The caller initiates completion by calling *Complete(..)* and may optionally wait until completion finished by using the *Task* object returned from property *Completion*.


#### amarok.agents

- CHG:	**[Breaking]** Renamed type *Unit* to *Empty*. Use *Empty.Instance* instead of *Unit.Instance*.


##### Message

- CHG:	**[Breaking]** Renamed property *Address* to *Label* and changed type from *String* to *Object*. The new name 'Label' expresses the meaning of the property: it's not thought as an address for routing the message to a destination, but instead it is intended to be an optional attached tag, a label carrying some kind of information that can be used to filter messages.

- CHG:	**[Breaking]** The property *Label* will now throw an *InvalidOperationException* (instead of an *ArgumentException*) in case that the property setter is called and *Label* is already set.

- NEW:	Added property *HasLabel* that returns a boolean value indicating whether a *Label* has already been set.

- NEW:	Added implementation for *ToString()* that returns a string containing the set label.


##### Operation

- CHG:	**[Breaking]** Changed property *Progress* from delegate to an event. Now, multiple handler may register for the same progress events.

- FIX:	**[Breaking]** The thread reporting progress is now decoupled from the threads that handle progress events. Prior, the reporting thread was calling the progress event handlers directly. This was an unintended behavior and has been changed.

- NEW:	Introduced methods *Acquire()* and *TryAcquire()*. Those methods are used by the agent infrastructure to ensure that an operation message is processed by only one operation handler.


##### Agents

- CHG:	**[Breaking]** Changed namespace of following types from *Amarok.Agents.Core* to *Amarok.Agents*:
	- *ExecutionMode*
	- *ExecutionModeAttribute*
	- *ParallelismLevel*
	- *ParallelismLevelAttribute*

- CHG:	**[Breaking]** Removed property *Address* and method *ResetAddress()* from *Agent*. The concept that agents contain	an address has been deprecated.

- CHG:	**[Breaking]** The agent infrastructure now ensures that an operation messages is processed by only one operation	handler, even if multiple operation handlers are registered for this operation message type. The first operation handler that receives the operation message will acquire and process the operation; all other operation handler will output a warning message. This new behavior does not affect message handler; those are still able to handle all kinds of messages.

- CHG:	**[Breaking]** Agents now implement the new asynchronous completion pattern represented by *ICompletable*. The interface *IAgent* derives from *ICompletable* and provides functionality to tear down agents asynchronously.
		
- CHG:	**[Breaking]** The overridable method *OnDispose()* was replaced by *OnCleanup()*. For full control over the completion you can override *OnCompleting(..)*, *OnComplete(..)* or *OnCompleted()*. For simple cleanup tasks *OnCleanup()* should be suitable.

- CHG:	The overloaded extension method *Subscribe()* on *IAgent* now returns *ISubscription* instead of *IDisposable*. This enables one to release the subscription in an asynchronous manner.

- FIX:	Fixed exception in agent handler inspection logic when encountering an operation handler with a method parameter type (message type) that derives directly from *Operation*. Now an appropriate warning message is generated. Message types for operation handler must derive directly or indirectly from *Operation<R, P>*.

- NEW:	Introduced static class *AgentGlobals* that contains global configuration values primarily used to provide the underlying Task Parallel Library (TPL) Data Flow Blocks with block options.


##### AgentFactory

- CHG:	**[Breaking]** Removed overloaded methods *SpawnAgent(..)* from *AgentFactory* that accept an address. The concept that agents contain an address has been deprecated.

- NEW:	Added overloaded methods *SpawnAgent(..)* without *AgentOptions* argument. The agent options on these messages default to *AgentOptions.Empty*.


##### MessageBus

- CHG:	**[Breaking]** *MessageBus* now implements the new asynchronous completion pattern represented by *ICompletable*. The interface *IMessageBus* derives from *ICompletable* and provides functionality for tearing down the message bus asynchronously.

- CHG:	**[Breaking]** The overloaded methods *Connect(..)* and *Subscribe(..)* on *IMessageBus* now return *ISubscription* instead of *IDisposable*, enabling one to disconnect or unsubscribe in an asynchronous manner.


##### Subsystem

- CHG:	**[Breaking]** *Subsystem* now implements the new asynchronous completion pattern represented by *ICompletable*. The interface *ISubsystem* derives from *ICompletable* and provides functionality for tearing down the subsystem and contained agents asynchronously.
	
- CHG:	**[Breaking]** The overridable method *OnDispose()* was removed from *Subsystem*. If you need more control over the completion you can override *OnCompleting(..)*, *OnComplete(..)* or *OnCompleted()*.

- CHG:	**[Breaking]** Removed overloaded methods *SpawnAgent(..)* from *Subsystem* that accept an address. The concept that agents contain an address has been deprecated.

- NEW:	Added overloaded methods *SpawnAgent(..)* without *AgentOptions* argument to *Subsystem*. The agent options for these methods default to *AgentOptions.Empty*.


##### Runtime

- CHG:	**[Breaking]** *Runtime* now implements the new asynchronous completion pattern represented by *ICompletable*.

- CHG:	**[Breaking]** The overridable method *OnDispose()* on *Runtime* was replaced by *OnCleanup()*. For full control over the completion one can override *OnCompleting(..)*, *OnComplete(..)* or *OnCompleted()*. For simple cleanup tasks *OnCleanup()* should be suitable.
 
- CHG:	**[Breaking]** Removed types *RuntimeAgent* and *RuntimeAgent<TEnvironment, TOptions>*. Derive from *Agent* or *Agent<TEnvironment, TOptions>* instead.

- CHG:	Added optional boolean parameter to method *Shutdown()* in *IRuntime*. This new parameter controls how the entire runtime including all subsystems and agents should shut down.


#### amarok.presentation

- CHG:	**[Breaking]** Changed namespace of following types *from Amarok.Presentation.Core* to *Amarok.Presentation*:
	- *CloseWindowAction*
	- *ShowMessageBoxAction*
	- *ShowConfirmationMessageBoxAction* 
	- *ShowInformationMessageBoxAction*
	- *ShowWarningMessageBoxAction*
	- *ShowErrorMessageBoxAction*
	- *ViewActionManager*
	- *ViewActionRoutedEventHandler*
	- *ViewActionRoutedEventArgs*
	- *ViewHelper*

- NEW:	Added overloaded constructors to all *Controller* types that accept a view-model instance as argument.

- NEW:	Added overloaded methods *SpawnController(..)* to *ControllerFactory* that accept a view-model instance as argument.




## Version 1.2 (28. Mar. 2012)

- NEW:	Introduced initial support for .NET Framework 4.5 Beta 1. All assemblies are provided for both .NET Framework 4 and .NET Framework 4.5 Beta 1. Assemblies targeting .NET Framework 4 are compiled against the latest CTP version of *System.Threading.Tasks.Dataflow*. Assemblies targeting .NET Framework 4.5 Beta 1 are compilied against the version that is included in the .NET Framework 4.5.


#### amarok.framework

- FIX:	Fixed method *AsString()* on *EnumerableExtensions* to handle null-reference collection items.


#### amarok.presentation
 
- FIX:	Fixed property-changed registrations made via *RegisterForPropertyChange(..)* on *ViewModel*. Now, those registrations are no longer released too soon. Please note, the underlying implementation changed; weak references are no longer used. Thus, you have to dispose registrations manually to prevent memory leaks.

- NEW:	Added property *HasItems* to *ViewModelCollection<T>*. This property can be used in data binding; appropriate property change events are raised.

- NEW:	Added overloaded methods *RaisePropertyChanged(..)* to *ViewModelCollection<T>*. Those methods are useful when deriving from and extending *ViewModelCollection<T>*.

- NEW:	Introduced new value converters:
	- *CollapsedWhenNullOrEmptyConverter*
	- *CollapsedWhenNotNullConverter*
	- *CollapsedWhenNotNullOrEmptyConverter*
	- *HiddenWhenNullOrEmptyConverter*
	- *HiddenWhenNotNullConverter*
	- *HiddenWhenNotNullOrEmptyConverter*
	- *HasTextConverter*
	- *HasNotTextConverter*
	- *IsNullConverter*
	- *IsNotNullConverter*




## Version 1.1 (23. Feb. 2012)


#### amarok.framework

- CHG:	**[Breaking]** Moved types *VerifyResources* and *ExceptionResources* into namespace *Amarok.Resources* to prevent name conflicts with other resource types.

- NEW:	Introduced new methods *MakeDWord()*, *GetLowWord()*, *GetHighWord()* on class *Helper*.

- NEW:	Introduced base types *Identity*, *Entity* and *Entity<T>*, which can be used to implement custom identity and entity types.


#### amarok.agents

- CHG:	**[Breaking]** Moved types *AgentResources* and *RuntimeResources* into namespace *Amarok.Agent.Resources* to prevent name conflicts with other resource types.

- NEW:	Introduced overrideable method *OnInitialize()* on *Agent*. This method enables derived types to implement custom initialization logic. The method is called once before all other concurrent and exclusive handlers with the arrival of the first incoming message.
 
- NEW:	Introduced exception type *FailureException* that can be used to represents application failures. Each failure is expressed by a unique failure number, which consists of a facility code and failure code. Facility codes indicate to which subsystem the failure belongs. The failure code is a sequential number unique per facility code.


#### amarok.presentation

- NEW:	Introduced new collection type *ViewModelCollection<T>* for building view model collection providing addition methods for manipulating the collection and its contained items. Like *ObservableCollection<T>* this new collection type supports raising property and collection changed events and thus can be used in data binding.




## Version 1.0 (24. Jan. 2012)

 - initial release
